package page;

import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.LinkedHashMap;
import java.util.Map;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import javax.sql.DataSource;

import ressource.CadreProduit;
import ressource.CadreSouhait;

/**
 * Servlet implementation class MesSouhaitsServlet
 */
public class MesSouhaitsServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	
    /**
     * @see HttpServlet#HttpServlet()
     */
    public MesSouhaitsServlet() {
        super();
    }
    
	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		HttpSession session = request.getSession();
		RequestDispatcher dis;
		Connection con = null;
		ServletContext context = getServletContext();
		
		//Si je ne suis pas connecte, je suis redirige
		Integer membre = (Integer)session.getAttribute("user_id");
		if(membre == null){
			dis = request.getRequestDispatcher("/login.jsp");
			dis.forward(request, response);
			return;
		}
		
		try{
			Context namingContext;
			PreparedStatement pstmt;
			ResultSet rs;
			Map<CadreProduit, CadreSouhait> souhaits = new LinkedHashMap<CadreProduit, CadreSouhait>();
			CadreProduit p;
			CadreSouhait s;
			
			namingContext = new InitialContext();
			DataSource dataSource = (DataSource)namingContext.lookup("java:comp/env/jdbc/MiniIBay");
			con = dataSource.getConnection();
			
			String action = request.getParameter("action");
			if(action != null && action.equals("correspond")){
				//Recuperation du nombre de resultats pour la requete
				pstmt = con.prepareStatement("SELECT COUNT(*) AS nb_results FROM `produit` p , `type_produit` tp, `souhait` s, `annonce` a WHERE p.id_produit = s.id_produit AND p.id_type = tp.id_type AND a.id_produit=p.id_produit AND a.stock > 0 AND s.prix >= a.prix AND s.id_membre=?"); 
				pstmt.setInt(1, membre);
				
				Integer nb_results = 0;
				rs = pstmt.executeQuery();
				if(rs.next()){
					nb_results = rs.getInt("nb_results");
					rs.close();
				}
				
				//Recuperation des souhaits, et des annonces correspondantes
				request.setAttribute("action", "correspond");
				pstmt = con.prepareStatement("SELECT a.id_annonce, s.prix, s.commentaire, s.date, tp.nom, p.id_produit, p.intitule, p.photo FROM `produit` p , `type_produit` tp, `souhait` s, `annonce` a WHERE p.id_produit = s.id_produit AND p.id_type = tp.id_type AND a.id_produit=p.id_produit AND a.stock > 0 AND s.prix >= a.prix AND s.id_membre=? ORDER BY s.date LIMIT ?, ?");
				pstmt.setInt(1, membre);

				//On gere la pagination :
				Integer resultspage = 20;
				Integer i=0;
				try{
					resultspage = Integer.parseInt(context.getAttribute("nbresults").toString());
					if(request.getParameter("page") != null)
						i = Integer.parseInt(request.getParameter("page")) - 1;
				}catch(NumberFormatException e){
					i = 0;
				}
				if(i < nb_results / resultspage ) {
					int buff = i * resultspage;
					pstmt.setInt(2, buff);
					pstmt.setInt(3, resultspage);
				}
				else{
					pstmt.setInt(2, 0);
					pstmt.setInt(3, resultspage);
				}
				request.setAttribute("nb_results", (int)nb_results/resultspage);
				request.setAttribute("page", i+1);
				
				rs = pstmt.executeQuery();
				while(rs.next()){
					s = new CadreSouhait();
					s.setIdAnnonce(rs.getInt("id_annonce"));
					s.setDate(rs.getTimestamp("date"));
					s.setPrix(rs.getFloat("prix"));
					s.setCommentaire(rs.getString("commentaire"));
					
					p = new CadreProduit();
					p.setId(rs.getInt("id_produit"));
					p.setIntitule(rs.getString("intitule"));
					p.setPhoto(rs.getString("photo"));
					
					souhaits.put(p, s);
				}
			}else{
				//Recuperation du nombre de resultats pour la requete
				pstmt = con.prepareStatement("SELECT COUNT(*) AS nb_results FROM `produit` p , `type_produit` tp, `souhait` s WHERE p.id_produit = s.id_produit AND p.id_type = tp.id_type AND s.id_membre=?"); 
				pstmt.setInt(1, membre);
				
				Integer nb_results = 0;
				rs = pstmt.executeQuery();
				if(rs.next()){
					nb_results = rs.getInt("nb_results");
					rs.close();
				}
				
				//Recuperation des souhaits emis par le membre
				pstmt = con.prepareStatement("SELECT s.prix, s.commentaire, s.date, tp.nom, p.id_produit, p.intitule, p.photo FROM `produit` p , `type_produit` tp, `souhait` s WHERE p.id_produit = s.id_produit AND p.id_type = tp.id_type AND s.id_membre=? ORDER BY s.date LIMIT ?, ?");
				pstmt.setInt(1, membre);
				
				//On gere la pagination :
				Integer resultspage = 20;
				Integer i=0;
				try{
					resultspage = Integer.parseInt(context.getAttribute("nbresults").toString());
					if(request.getParameter("page") != null)
						i = Integer.parseInt(request.getParameter("page")) - 1;
				}catch(NumberFormatException e){
					i = 0;
				}
				if(i < nb_results / resultspage ) {
					int buff = i * resultspage;
					pstmt.setInt(2, buff);
					pstmt.setInt(3, resultspage);
				}
				else{
					pstmt.setInt(2, 0);
					pstmt.setInt(3, resultspage);
				}
				request.setAttribute("nb_results", (int)nb_results/resultspage);
				request.setAttribute("page", i+1);
				
				rs = pstmt.executeQuery();
				while(rs.next()){
					s = new CadreSouhait();
					s.setDate(rs.getTimestamp("date"));
					s.setPrix(rs.getFloat("prix"));
					s.setCommentaire(rs.getString("commentaire"));
					
					p = new CadreProduit();
					p.setId(rs.getInt("id_produit"));
					p.setIntitule(rs.getString("intitule"));
					p.setPhoto(rs.getString("photo"));
					
					souhaits.put(p, s);
				}
			}
			
			request.setAttribute("souhaits", souhaits);
			
			dis = request.getRequestDispatcher("/messouhaits.jsp");
			dis.forward(request, response);
		}catch(NamingException e){
			// TODO Auto-generated catch block
			e.printStackTrace();
			response.sendRedirect("profile");
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			response.sendRedirect("profile");
		} finally {
			try {
				if(con != null) con.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	}

}
